package cn.iocoder.yudao.module.design.service.problem;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.design.controller.admin.problem.vo.*;
import cn.iocoder.yudao.module.design.dal.dataobject.problem.ProblemCountDO;
import cn.iocoder.yudao.module.design.dal.dataobject.problem.ProblemDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 项目问题 Service 接口
 *
 * @author 芋道源码
 */
public interface ProblemService {

    /**
     * 创建项目问题
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createProblem(@Valid ProblemCreateReqVO createReqVO);

    /**
     * 更新项目问题
     *
     * @param updateReqVO 更新信息
     */
    void updateProblem(@Valid ProblemUpdateReqVO updateReqVO);

    void updateProblemStatus(ProblemUpdateReqVO updateReqVO);

    void updateProblemStatus(Long id ,String statusCd);
    /**
     * 修改问题状态
     * @author Annie
     * @time 2023/7/28 15:15
     * @param[1] id 问题id
     * @param[2] statusCd  状态
     * @throws
     */
    void updateRelHandUpStatus(Long id ,String statusCd);
    /**
     * 删除项目问题
     *
     * @param id 编号
     */
    void deleteProblem(Long id);

    /**
     * 获得项目问题
     *
     * @param id 编号
     * @return 项目问题
     */
    ProblemDO getProblem(Long id);

    /**
     * 获得项目问题详情
     *
     * @param id 编号
     * @return 项目问题
     */
    ProblemRespDetailVO getProblemData(Long id);
    /**
     * 获得项目问题列表
     *
     * @param ids 编号
     * @return 项目问题列表
     */
    List<ProblemDO> getProblemList(Collection<Long> ids);

    /**
     * 获得项目问题分页
     *
     * @param pageReqVO 分页查询
     * @return 项目问题分页
     */
    PageResult<ProblemDO> getProblemPage(ProblemPageReqVO pageReqVO);

    /**
     * 获得项目问题列表, 用于 Excel 导出
     *
     * @param exportReqVO getSimProblemPage
     * @return 项目问题列表
     */
    List<ProblemDO> getProblemList(ProblemExportReqVO exportReqVO);


    /**
     * 查询个人需要处理的每个项目问题
     * @return
     */
    List<ProblemCountDO> getProblemCount(Collection<Long> houseIds);

    default Map<Long, ProblemCountDO> getProblemCountMap(Collection<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return new HashMap<>();
        }
        return CollectionUtils.convertMap(getProblemCount(ids), ProblemCountDO::getHouseId);
    }
    /**
     * 查询个人需要处理的项目问题
     * @return
     */
    int getProblemCount(Long houseId);

    List<ProblemDO> getRelProblemList(Long problemId,String statusCd);

    /**
     * 查询关联问题 未完成的问题列表
     * @author Administrator
     * @time 2023/7/30 14:07
     * @param[1] problemId
     * @return List<ProblemDO>
     * @throws
     */
    List<ProblemDO> getRelUnProblemList(Long problemId);

    /**
     * 异步编排问题处理结果通知
     * @author Administrator
     * @time 2023/7/30 14:48
     * @param[1] problemId
     * @throws
     */
    void dealProblemNotifyWorker(Long problemId);


    /**
     * 获得项目问题简要
     *
     * @param context 查询参数
     * @return 项目问题
     */
    List<ProblemDO> getProblemSimInfo(ProblemSimReqVO context);

    void addRelProblem(ProblemRelReqVO context);

    List<ProblemDO> getPreProblemSimList(ProblemSimReqVO context);

    void createProblemDealerIds(List<Long> dealerIds, Long problemId);
}
